package cn.colat.micse.common.pojo.bo;

import cn.colat.micse.common.constant.CommonConstant;
import cn.hutool.core.date.DateUtil;
import lombok.Data;

import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Locale;
import java.util.Map;

@Data
public class AlipayNotifyBO {
    /**
     * 交易状态：
     * WAIT_BUYER_PAY（交易创建，等待买家付款）、
     * TRADE_CLOSED（未付款交易超时关闭，或支付完成后全额退款）、
     * TRADE_SUCCESS（交易支付成功）、
     * TRADE_FINISHED（交易结束，不可退款）
     */
    private String status;
    /**
     * 交易的订单金额，单位为元，两位小数。该参数的值为支付时传入的total_amount
     */
    private BigDecimal totalAmount;
    /**
     * 实收金额，单位为元，两位小数。该金额为本笔交易，商户账户能够实际收到的金额
     */
    private BigDecimal receiptAmount;
    /**
     * 买家实付金额，单位为元，两位小数。该金额代表该笔交易买家实际支付的金额，不包含商户折扣等金额
     */
    private BigDecimal buyerPayAmount;
    /**
     * 订单号
     */
    private String tradeNo;
    /**
     * 支付宝订单号
     */
    private String alipayTradeNo;
    /**
     * 支付时间
     */
    private Date payTime;


    public static AlipayNotifyBO parseParameterMap(Map<String, String[]> map) {
        String status = map.get("trade_status").length > 0 ? map.get("trade_status")[0] : null;
        BigDecimal totalAmount = map.get("total_amount").length > 0 ? new BigDecimal(map.get("total_amount")[0]) : null;
        BigDecimal receiptAmount = map.get("receipt_amount").length > 0 ? new BigDecimal(map.get("receipt_amount")[0]) : null;
        BigDecimal buyerPayAmount = map.get("buyer_pay_amount").length > 0 ? new BigDecimal(map.get("buyer_pay_amount")[0]) : null;
        String tradeNo = map.get("out_trade_no").length > 0 ? map.get("out_trade_no")[0] : null;
        String alipayTradeNo = map.get("trade_no").length > 0 ? map.get("trade_no")[0] : null;
        Date payTime = map.get("gmt_payment").length > 0 ? DateUtil.parse(map.get("gmt_payment")[0], CommonConstant.DATE_FORMAT, Locale.CHINA) : null;

        AlipayNotifyBO bo = new AlipayNotifyBO();
        bo.setStatus(status);
        bo.setTotalAmount(totalAmount);
        bo.setReceiptAmount(receiptAmount);
        bo.setBuyerPayAmount(buyerPayAmount);
        bo.setTradeNo(tradeNo);
        bo.setAlipayTradeNo(alipayTradeNo);
        bo.setPayTime(payTime);
        return bo;
    }

    public static AlipayNotifyBO parseReq(HttpServletRequest req) {
        Map<String, String[]> map = req.getParameterMap();
        return parseParameterMap(map);
    }

    /**
     * 是否付款成功
     */
    public boolean isPaySuccess() {
        return "TRADE_SUCCESS".equals(status);
    }

    /**
     * 是否 已创建 支付中
     */
    public boolean isPaying() {
        return "WAIT_BUYER_PAY".equals(status);
    }

    /**
     * 是否关闭
     */
    public boolean isClose() {
        return "TRADE_CLOSED".equals(status);
    }

    /**
     * 是否交易结束，不可退款
     */
    public boolean isFinish() {
        return "TRADE_FINISHED".equals(status);
    }
}
